Skip to content

ci: cut releases automatically so merged deploy/ state reaches the cluster#62

Merged
devantler merged 1 commit into
mainfrom
claude/ci-release-automation
Jun 23, 2026
Merged

ci: cut releases automatically so merged deploy/ state reaches the cluster#62
devantler merged 1 commit into
mainfrom
claude/ci-release-automation

Conversation

@devantler

Copy link
Copy Markdown
Contributor

🤖 Generated by the Daily AI Assistant

Problem — merged deploy/ state never reaches the cluster

The github-config tenant on the platform cluster syncs the org's declarative GitHub state from a cosign-signed OCI artifact (oci://ghcr.io/devantler-tech/github-config/manifests, semver: ">=1.0.0"). That artifact is published by cd.yaml, which runs only on push: tags: v*. ci.yaml only validates PRs; nothing in the repo cuts a v* tag on merge to main.

The last tags (v1.4.0–v1.4.2, 2026-06-18) were hand-cut by the maintainer during the initial rollout. Since then three deploy/ PRs merged but no tag was cut, so none of them are live:

Merged PR Desired state Live on cluster?
06-19 #50 feat(deploy): maintainers team + 12 TeamRepository bindings Team/TeamRepositoryNo resources found
06-21 #57 feat(deploy): IssueLabels across all repos IssueLabelsNo resources found
06-22 #60 chore(repositories): repository discoverability metadata ❌ (still 1.4.2)

Live evidence: the github-config OCIRepository is still on 1.4.2@sha256:293cbda…; Repository CRs are all True/True (provider healthy) but kubectl get teams,teamrepositories,issuelabels -A returns nothing. So the declarative-GitHub GitOps path is broken end-to-end after merge — exactly the "manage GitHub declaratively" guarantee #57/#50 were meant to deliver.

Fix — the standard release pipeline every other repo already has

Add a Release workflow that runs the shared create-release.yaml (semantic-release) on push to main, plus a minimal .releaserc (@semantic-release/commit-analyzer only). semantic-release cuts the v* tag → cd.yaml publishes the OCI artifact → the tenant reconciles. This is byte-identical in structure to go-template's release.yaml + .releaserc (the canonical template; its releases are auto-cut by github-actions[bot]), differing only in the pinned reusable-workflow SHA (latest v5.6.6).

⚠️ Blast radius of the first auto-release

Once this merges, the first run analyzes commits since v1.4.2 — which include #50 and #57 (feat:) — so it cuts v1.5.0 and delivers the whole backlog at once. That includes #57's IssueLabels, which are authoritative (they remove any labels not in the declarative set). That is the intended behavior of #57, surfaced here so the first reconcile is no surprise.

Design question for the promoter

If .github releases were intentionally kept manual to gate when sensitive org-state reconciles, close this. The evidence (3 PRs / 5 days of silent, unintended drift; every other repo auto-releases; no documented manual-gating intent) says this is a gap, not a design choice — but the promotion is your call.

Validation

  • kubectl kustomize deploy/ — OK (unchanged; this PR adds no manifests).
  • release.yaml YAML valid; structurally identical to go-template's working workflow.
  • .releaserc valid JSON, mirrors go-template.
  • Root cause confirmed against live cluster + the OCIRepository revision + release/run history.

…uster

The github-config tenant on the platform cluster syncs the org's declarative
GitHub state from a cosign-signed OCI artifact that cd.yaml publishes only on
v* tags. Nothing cut those tags on merge to main, so every deploy/ change since
the last hand-cut tag (v1.4.2, 2026-06-18) — the maintainers team (#50), issue
labels (#57) and repository discoverability metadata (#60) — was validated,
merged, and then never delivered: the OCIRepository is still pinned at 1.4.2 and
no Team/IssueLabel CRs exist on the cluster.

Add the standard release pipeline every other devantler-tech repo already has:
a Release workflow that runs create-release.yaml (semantic-release) on push to
main, plus a minimal .releaserc. semantic-release cuts the v* tag, which
triggers cd.yaml to publish the OCI artifact, which the tenant reconciles.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@devantler devantler marked this pull request as ready for review June 23, 2026 05:59
@devantler devantler merged commit e2fdd87 into main Jun 23, 2026
8 checks passed
devantler added a commit that referenced this pull request Jun 23, 2026
PR #50 inadvertently removed external-secret.yaml and provider-config.yaml
from deploy/kustomization.yaml's resources, so the github-config OCI artifact
no longer ships the credential ExternalSecret or the ProviderConfig. The break
stayed latent while the tenant OCIRepository was pinned at v1.4.2 (which still
carried them); #62's auto-release cut v1.5.0 from current main, and the prune
on apply deleted the ExternalSecret and started terminating the ProviderConfig
-> github-app-credentials is gone -> every Repository/IssueLabels/Team managed
resource fails to connect (Synced=False, ReconcileError: credentials secret
github-app-credentials not found).

Restore both entries (with a guard comment) so the artifact materializes the
credential again and the declarative GitHub state reconciles.

Co-authored-by: devantler <devantler@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant